""" 运算符 """

"""算数运算符"""
print("(一)算数运算符：")
x = 15
y = 4
print("x=%d, y=%d" % (x, y))
# + - * /
# ①输出: x + y = 19
print("x + y =", x + y)
# ②输出: x - y = 11
print("x - y =", x - y)
# ③输出: x * y = 60
print("x * y =", x * y)
# ④输出: x / y = 3.75
print("x / y =", x / y)

# //(整除)  %(求余)
# ①输出: x // y = 3
print("x // y =", x // y)
# ②输出: x % y = 3
print("x % y =", x % y)

# **（幂运算）
# 输出: x ** y = 50625
print("x ** y =", x**y)

print("")

print("虚数运算：")
# 虚数运算（实部管实部，虚部管虚部）
c1, c2 = 4 + 2j, 5 + 3j
print(f"c1={c1}, c2={c2}")
print("c1 + c2 =", c1 + c2)

print("")

print("精度问题：")
# 计算精度问题（bool型向整数靠齐，浮点型不会变整数）
print("1.5 - 0.5 =", 1.5 - 0.5)
print("2 - 1.0 =", 2 - 1.0)
print("True +2 =", True + 2)
print("True - False =", True - False)

print("")

"""比较运算符"""
print("(二)比较运算符：")
# 结果是bool型
# >、<、==、！=、>=、<=
x = 10
y = 12
print("x=%d, y=%d" % (x, y))
# ①输出: x > y 是 False
print("x > y 是 ", x > y)
# ②输出: x < y 是 True
print("x < y 是 ", x < y)
# ③输出: x == y 是 False
print("x == y 是 ", x == y)
# ④输出: x != y 是 True
print("x != y 是 ", x != y)
# ⑤输出: x >= y 是 False
print("x >= y 是 ", x >= y)
# ⑥输出: x <= y 是 True
print("x <= y 是 ", x <= y)

print("")

"""逻辑运算符"""
print("(三)逻辑运算符：")
# and、or、not
x = True
y = False
print("x=%s, y=%s" % (x, y))
# and : 如果两个操作数都为真，则为真	x和y
print("x and y 是 ", x and y)
# or : 如果任何一个操作数为真，则为真	x或y
print("x or y 是 ", x or y)
# not : 如果操作数为false，则为True（对操作数进行补充）
print("not x 是 ", not x)

print("")

print("逻辑运算符优先级：")
# 按照从高到低的顺序为：not > and > or
a = True
b = False
c = True
print("a=%s, b=%s, c=%s" % (a, b, c))
# 等价于 ((not a) and b) or c
result1 = not a and b or c
print(f"not a and b or c =  {result1}")
# 等价于 a or (b and (not c))
result2 = a or b and not c
print(f"a or b and not c =  {result2}")

print("")

"""位运算符"""
print("(四)位运算符：")
# &（按位与）、|（按位或）、~（按位非）、^（按位异或）、>>（按位右移）、<<（按位左移）
# 位运算的时候转化为二进制进行计算
a = 60  # 二进制: 00111100
b = 13  # 二进制: 00001101
print(f"a={a} (二进制:{bin(a)}), b={b} (二进制:{bin(b)})")
# &（按位与）：对应位都为1时,结果位才为1
print(f"a & b = {a & b} (二进制:{bin(a & b)})")
# |（按位或）：对应位有一个为1时,结果位就为1
print(f"a | b = {a | b} (二进制:{bin(a | b)})")
# ~（按位非）: 对数的所有二进制位取反（包括符号位）
print(f"~b = {~b} (二进制:{bin(~b)})")
# ^（按位异或）: 对应位不同时,结果位为1
print(f"a ^ b = {a ^ b} (二进制:{bin(a ^ b)})")
# >>（按位右移）: 将数的二进制位全部右移指定位数，高位补符号位(符号位：正数为0，负数为1)
print(f"b >> 2 = {b>>2} (二进制:{bin(b>>2)})")
# <<（按位左移）: 将数的二进制位全部左移指定位数，低位补0
print(f"b << 2 = {b<<2} (二进制:{bin(b<2)})")

print("")

"""身份运算符"""
print("(五)身份运算符：")
# is、is not
x = 10
y = 12
z = 10
print("x=%d, y=%d, z=%d" % (x, y, z))
# is：如果操作数相同，则为真（引用同一对象）
print(f"x is y = {x is y}")
print(f"x is z = {x is z}")
# is not: 如果操作数不相同，则为真（不引用同一对象）	x不是真
print(f"x is not y = {x is y}")
print(f"x is not z = {x is z}")

print("")

"""成员运算符"""
print("(六)成员运算符：")
# in、not in
x = "Hello world"
y = {"a", "b"}
print(f"x = {x}, y = {y}")
# in:如果在序列中找到值/变量，则为真
res = "H" in x
print(f"H in x = {res}")
res = 1 in y
print(f"1 in y = {res}")
# not in:如果在序列中未找到值/变量，则为真
res = "hello" not in x
print(f"'hello' not in x = {res}")
res = "a" not in y
print(f"'a' not in y = {res}")

"""赋值运算符"""
# 赋值运算符会改变变量的值
